package mysql8学习.初级.第13章_约束;
/**
 * **FOREIGN KEY**  **外键约束**
 * 限定某个表的某个字段的引用完整性。
 * 比如：员工表的员工所在部门的选择，必须在部门表能找到对应的部分。
 *
 * 主表和从表/父表和子表          可以同一个表的不同字段  进行外键关联
 *
 * 主表（父表）：被引用的表，被参考的表
 * 从表（子表）：引用别人的表，参考别人的表
 *
 * 例如：员工表的员工所在部门这个字段的值要参考部门表：部门表是主表，员工表是从表。
 * 例如：学生表、课程表、选课表：选课表的学生和课程要分别参考学生表和课程表，
 *      学生表和课程表是主表，选课表是从表。
 *
 *  特点
 *
 * （1）从表的外键列，必须 引用/参考 主表的主键或唯一约束的列
 *     为什么？     因为被依赖/被参考的值必须是唯一的
 * （2）在创建外键约束时，如果不给外键约束命名，**默认名不是列名，而是自动产生一个外键名**
 *      （例如 student_ifblk_1;），也可以指定外键约束名。
 * （3）创建(CREATE)表时就指定外键约束的话，"先创建主表，再创建从表"
 * （4）删表时，先删从表（或先删除外键约束），再删除主表
 * （5）当主表的记录被从表参照时，主表的记录将不允许删除，
 *      如果要删除数据，需要先删除从表中依赖该记录的数据，然后才可以删除主表的数据
 * （6）在“从表”中指定外键约束，并且一个表可以建立多个外键约束
 * （7）从表的外键列与 主表被参照的列 "名字可以不相同"，但是
 *      数据类型必须一样，逻辑意义一致。
 *      如果类型不一样，创建子表时，就会出现错误“ERROR 1005 (HY000):Can't create table'database.tablename'(errno: 150)”。
 *      例如：都是表示部门编号，都是int类型。
 * （8）**当创建外键约束时，系统默认会在所在的列上建立对应的普通索引**。
 *      但是索引名是外键的约束名。（根据外键查询效率很高）
 * （9）删除外键约束后，必须`手动`删除对应的索引
 *
 */
public class H1_外键约束介绍 {
}

